package br.com.ava.core.infra.arquivo;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import br.com.ava.core.ConstantesMensagens;
import br.com.ava.core.infra.excecao.NegocioException;

import com.sshtools.j2ssh.SftpClient;
import com.sshtools.j2ssh.SshClient;
import com.sshtools.j2ssh.authentication.AuthenticationProtocolState;
import com.sshtools.j2ssh.authentication.PasswordAuthenticationClient;
import com.sshtools.j2ssh.configuration.SshConnectionProperties;
import com.sshtools.j2ssh.transport.IgnoreHostKeyVerification;
import com.sshtools.j2ssh.transport.InvalidHostFileException;

/**
 * Classe utilitária para envio de arquivo via SFTP.
 * 
 */
public class SFtpUtil {

	private static SFtpUtil instance;

	private SFtpUtil() {
		// Apenas para não deixar construir.
	}

	public static synchronized SFtpUtil getInstance() {
		if (instance == null) {
			instance = new SFtpUtil();
		}
		return instance;
	}

	public static void setInstance(SFtpUtil sFtpUtil) {
		instance = sFtpUtil;
	}

	private SshClient abrirConexao(String host, int porta, String usuario,
			String senha) throws InvalidHostFileException, IOException {

		SshClient ssh = new SshClient();

		// Propriedades de conexão
		SshConnectionProperties properties = new SshConnectionProperties();
		properties.setHost(host);
		properties.setPort(porta);
		properties.setPrefCSEncryption("blowfish-cbc");
		// Conectando ao servidor
		ssh.connect(properties, new IgnoreHostKeyVerification());

		// Autenticação
		PasswordAuthenticationClient passwordAuthenticationClient = new PasswordAuthenticationClient();
		passwordAuthenticationClient.setUsername(usuario);
		passwordAuthenticationClient.setPassword(senha);

		if (ssh.authenticate(passwordAuthenticationClient) != AuthenticationProtocolState.COMPLETE) {
			throw new NegocioException(
					ConstantesMensagens.MSG_ERRO_FALHA_LOGIN_SFTP);
		}

		return ssh;
	}

	public void transferenciaArquivos(String host, int porta, String usuario,
			String senha) throws IOException {

		SshClient conexaoSFTP = null;
		SftpClient cliente = null;
		String caminhoPasta = null;

		try {

			// Obtendo conexão SFTP
			conexaoSFTP = abrirConexao(host, porta, usuario, senha);

			// Obtendo um Cliente SFTP
			cliente = conexaoSFTP.openSftpClient();

			File arquivoFisico = new File("caminhoPasta");

			if (arquivoFisico != null) {

				// InputStream do arquivo origem
				FileInputStream arquivoInput = new FileInputStream(
						arquivoFisico);

				// Obtendo o caminho do arquivo
				caminhoPasta = "Caminho pasta do SFTP";

				// Criando o caminho do arquivo de destino
				cliente.mkdirs(caminhoPasta);

				// Adicionando no servidor SFTP o arquivo
				cliente.put(arquivoInput, caminhoPasta
						+ "NOME DO ARQUIVO ORIGEM");
			}

		} finally {

			// Finalizando conexão
			if (conexaoSFTP != null) {
				conexaoSFTP.disconnect();
			}

			// Finalizando sess�o
			if (cliente != null) {
				cliente.quit();
			}
		}
	}

}
